"""文件内容统计工具

此工具用于分析文件内容，统计文件的行数、单词数和字符数。
支持异常处理，确保文件操作的安全性。
"""


class FileAnalyzer:
    def __init__(self, file_path):
        """初始化FileAnalyzer对象
        
        Args:
            file_path (str): 要分析的文件路径
        """
        self.file_path = file_path
        self.content = None
        self.lines = []
        self.line_count = 0
        self.word_count = 0
        self.char_count = 0

    def read_file(self):
        """读取文件内容，处理可能的异常"""
        try:
            with open(self.file_path, 'r', encoding='utf-8') as file:
                self.content = file.read()
                # 重置文件指针并读取所有行
                file.seek(0)
                self.lines = file.readlines()
            return True
        except FileNotFoundError:
            print(f'错误：文件 {self.file_path} 不存在')
            return False
        except PermissionError:
            print(f'错误：没有权限读取文件 {self.file_path}')
            return False
        except Exception as e:
            print(f'读取文件时发生错误：{str(e)}')
            return False

    def count_lines(self):
        """统计文件行数"""
        self.line_count = len(self.lines)

    def count_words(self):
        """统计单词数
        
        将文本按空白字符分割来计算单词数
        """
        if self.content:
            # 将文本按空白字符分割，过滤掉空字符串
            words = [word for word in self.content.split() if word.strip()]
            self.word_count = len(words)

    def count_chars(self):
        """统计字符数（包括空白字符）"""
        if self.content:
            self.char_count = len(self.content)

    def analyze(self):
        """执行完整的文件分析"""
        if self.read_file():
            self.count_lines()
            self.count_words()
            self.count_chars()
            return True
        return False

    def display_results(self):
        """显示统计结果"""
        print('\n文件分析结果：')
        print(f'文件路径：{self.file_path}')
        print(f'总行数：{self.line_count} 行')
        print(f'单词数：{self.word_count} 个')
        print(f'字符数：{self.char_count} 个')


def main():
    # 示例用法
    file_path = input('请输入要分析的文件路径：')
    analyzer = FileAnalyzer(file_path)

    if analyzer.analyze():
        analyzer.display_results()


if __name__ == '__main__':
    main()
